/*
 * Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
 *
 * https://www.mall4j.com/
 *
 * 未经允许，不可做商业用途！
 *
 * 版权所有，侵权必究！
 */

import http from '@/utils/http'

// 公共方法集
const util = {
  /**
   * 清除登录信息(请求未授权时)
   */
  clearLoginInfo: () => {
    uni.removeStorageSync('bbcToken_us')
    uni.removeStorageSync('bbcAuthorities')
  },
  /**
   * 选择的图片是否小于2M
   * @param {Array} tempFiles 上传的图片临时文件数组
   * @return {Boolean} 是否小于2M
   */
  lessThan2M: (tempFiles) => {
    let flag = true
    for (let i = 0; i < tempFiles.length; i++) {
      const file = tempFiles[i]
      if (file.size > 1024 * 1024 * 2) {
        uni.showToast({
          title: '图片大小不能超过2M',
          duration: 2000,
          icon: 'none'
        })
        flag = false
        break
      }
    }
    return flag
  },
  /**
   * 复制文本
   * @param content
   * @param success
   * @param error
   * @returns {*}
   */
  uniCopy: ({ content, success, error }) => {
    if (!content) return error('复制的内容不能为空 !')
    content = typeof content === 'string' ? content : content.toString() // 复制内容，必须字符串，数字需要转换为字符串
    /**
     * 小程序端 和 app端的复制逻辑
     */
    // #ifndef H5
    uni.setClipboardData({
      data: content,
      success: function () {
        success('复制成功~')
      },
      fail: function () {
        success('复制失败~')
      }
    })
    // #endif

    /**
     * H5端的复制逻辑
     */
    // #ifdef H5
    if (!document.queryCommandSupported('copy')) { // 为了兼容有些浏览器 queryCommandSupported 的判断
      // 不支持
      error('浏览器不支持')
    }
    const textarea = document.createElement('textarea')
    textarea.value = content
    textarea.readOnly = 'readOnly'
    document.body.appendChild(textarea)
    textarea.select() // 选择对象
    textarea.setSelectionRange(0, content.length) // 核心
    const result = document.execCommand('copy') // 执行浏览器复制命令
    if (result) {
      success('复制成功~')
    } else {
      error('复制失败，请检查h5中调用该方法的方式，是不是用户点击的方式调用的，如果不是请改为用户点击的方式触发该方法，因为h5中安全性，不能js直接调用！')
    }
    textarea.remove()
    // #endif
  },

  /**
   * 获取唯一值
   */
  getUuid: () => {
    const s = []
    const hexDigits = '0123456789abcdef'
    for (let i = 0; i < 36; i++) {
      s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
    }
    s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
    s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
    s[8] = s[13] = s[18] = s[23] = '-'

    const uuid = s.join('')
    return uuid
  },
  /**
   * 时间戳转化为年 月 日 时 分 秒
   * number: 传入时间戳
   * format：返回格式，支持自定义，但参数必须与formateArr里保持一致
   */
  tsToDate: (number, format) => {
    const formateArr = ['Y', 'M', 'D', 'h', 'm', 's']
    const returnArr = []

    const date = new Date(number)
    returnArr.push(date.getFullYear())
    returnArr.push(date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1)
    returnArr.push(date.getDate() < 10 ? '0' + date.getDate() : date.getDate())

    returnArr.push(date.getHours() < 10 ? '0' + date.getHours() : date.getHours())
    returnArr.push(date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes())
    returnArr.push(date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds())

    for (const i in returnArr) {
      format = format.replace(formateArr[i], returnArr[i])
    }
    return format
  },
  /**
   * 进行相隔时间判断
   *
   * true 删除显示时间
   * false 保留显示时间
   */
  timeBeApart: (uppTime, preTime) => {
    if (!uppTime) {
      return false
    }
    const dateDiff = preTime - uppTime// 时间差的毫秒数
    const dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000))// 计算出相差天数
    const leave1 = dateDiff % (24 * 3600 * 1000) // 计算天数后剩余的毫秒数
    const hours = Math.floor(leave1 / (3600 * 1000))// 计算出小时数
    // 计算相差分钟数
    const leave2 = leave1 % (3600 * 1000) // 计算小时数后剩余的毫秒数
    const minutes = Math.floor(leave2 / (60 * 1000))// 计算相差分钟数
    return !(dayDiff >= 1 || hours >= 1 || minutes > 4)
  },
  /**
   * @param {Array} data 接收数据
   * @param {String} children  子属性名称
   * @returns Array 返回数据
   */
  treeDataTranslate: (data, children = 'children') => {
    const res = []
    list(data, children)

    function list (arr, children) {
      for (let i = 0; i < arr.length; i++) {
        res.push(arr[i])
        if (arr[i][children]) {
          list(arr[i][children], children)
          res[i][children] = null
        }
      }
    }

    return res
  },
  /**
   * @param {Number} x 原价格
   * @returns String 返回数据
   */
  priceAdd0: (x) => {
    const f = parseFloat(x) // 解析一个字符串，返回一个浮点数；
    let s = f.toString() // 把一个逻辑值转换为字符串，并返回结果；
    let rs = s.indexOf('.') // 返回某个指定的字符串值在字符串中首次出现的位置；如果字符串值没有出现，返回-1；

    // 没有小数点时：
    if (rs < 0) {
      rs = s.length
      s += '.'
    }
    while (s.length <= rs + 2) {
      s += '0'
    }
    return s
  },
  /**
   * 获取上的菜单列表 存在本地 shopMenuList
   */
  shopMenuList: () => {
    return new Promise((resolve) => {
      http.request({
        url: '/sys/shopMenu/nav',
        method: 'GET'
      }).then(({ data: res }) => {
        uni.setStorageSync('bbcAuthorities', res.authorities)
        resolve()
      })
    })
  },
  /**
   * @param {*} params  授权表示符
   * @returns {Boolean}  是否访问该页面权限
   *
   */
  isAuthorities: (params) => {
    const authorities = uni.getStorageSync('bbcAuthorities') ? uni.getStorageSync('bbcAuthorities') : []
    return authorities.includes(params)
  },
  /**
   * 文件地址校验
   * @param fileUrl 获取到的文件路径
   */
  checkFileUrl: (fileUrl) => {
    if (!fileUrl) return ''
    if (fileUrl === '/static/images/def.png') return fileUrl
    return fileUrl.indexOf('http') > -1 ? fileUrl : import.meta.env.VITE_APP_RESOURCES_URL + fileUrl
  },
  chooseImage ({ compress, sourceType, sizeType, orderItemInfo, idx, isImFile = false, count }) {
    return new Promise((resolve) => {
      const resData = []
      const obj = { src: '', quality: 0.2 }
      // #ifdef APP-PLUS
      uni.chooseImage({
        count: count || 1,
        sizeType: sizeType || ['compressed'],
        sourceType: sourceType || ['album'],
        success: (res) => {
          const tempFilePaths = res.tempFilePaths
          tempFilePaths.forEach((item, index) => {
            const obj = { src: item, quality: 0.2 }
            compress(obj, res.tempFiles[index]).then((filePath) => {
              util.plusIo(filePath).then((buffer) => {
                util.getPreSignUrl({ fileName: res.tempFiles[index].path, isImFile }).then(({ data }) => {
                  uni.request({
                    url: data.preSignUrl,
                    method: 'PUT',
                    data: buffer,
                    success: function () {
                      resData.push({ filePath: data.filePath, fileId: data.fileId, fileSize: res.tempFiles[index].size, type: sizeType ? '' : 1 })
                      if (res.tempFiles.length === resData.length) {
                        util.uploadSuccess(resData).then(() => {
                          resolve(resData)
                        })
                      }
                    }
                  })
                })
              })
            })
          })
        }
      })
      // #endif
      // #ifdef H5
      uni.chooseImage({
        count: count || 1,
        sizeType: sizeType || ['compressed'],
        sourceType: sourceType || ['album'],
        success: (res) => {
          const tempFilePaths = res.tempFilePaths
          orderItemInfo ? orderItemInfo[idx].imagesUploadCounts = 0 : orderItemInfo = undefined
          tempFilePaths.forEach((item, index) => {
            orderItemInfo && orderItemInfo[idx].imagesUploadCounts++
            obj.src = item
            compress(obj, res.tempFiles[index]).then(filePath => {
              util.getPreSignUrl({ fileName: res.tempFiles[index].name, isImFile }).then(({ data }) => {
                uni.request({
                  url: filePath,
                  method: 'GET',
                  responseType: 'arraybuffer',
                  success: function (requestRes) {
                    uni.request({
                      url: data.preSignUrl,
                      method: 'PUT',
                      data: requestRes.data,
                      success: function () {
                        resData.push({ filePath: data.filePath, fileId: data.fileId, fileSize: res.tempFiles[index].size, type: sizeType ? '' : 1 })
                        if (res.tempFiles.length === resData.length) {
                          util.uploadSuccess(resData).then(() => {
                            resolve(resData)
                          })
                        }
                      }
                    })
                  }
                })
              })
            })
          })
        }
      })
      // #endif
    })
  },
  plusIo: (filePath) => {
    return new Promise((resolve) => {
      plus.io.resolveLocalFileSystemURL(filePath, async function (entry) {
        entry.file(function (file) { // 读取文件
          const reader = new plus.io.FileReader()
          reader.readAsDataURL(file) // 以URL格式读取文件
          reader.onload = function () {
            const base64 = this.result.split(',')[1] // 获取base64字符串
            const buffer = uni.base64ToArrayBuffer(base64) // 转换为arrayBuffer格式
            resolve(buffer)
          }
        })
      })
    })
  },
  uploadSuccess (resData) {
    return http.request({
      url: '/admin/file/uploadSuccess',
      method: 'PUT',
      data: resData
    })
  },
  getPreSignUrl (data) {
    return http.request({
      url: '/admin/file/getPreSignUrl',
      method: 'GET',
      data
    })
  }
}

export default util
